/**
 * 用户管理路由模块
 * 
 * 实现用户增删改查(CRUD)操作:
 * 1. GET /api/users - 获取所有用户列表
 * 2. GET /api/users/:id - 根据ID获取特定用户
 * 3. POST /api/users - 创建新用户
 * 4. PATCH /api/users/:id - 更新用户信息
 * 5. DELETE /api/users/:id - 删除用户
 */

//引入express模块
const express = require("express");

//创建路由对象
const router = express.Router();

//引入用户模型
const { User } = require("../models");

//引入用户控制器
const userController = require("../controllers/users.controller");

// 引入公共的异步错误处理工具函数
const asyncHandler = require("../utils/asyncHandler");

/*
  @route GET /api/users/
  @desc 返回所有用户列表
  @access Public
  测试用例：
  //用例1：获取所有用户列表
  curl -X GET http://localhost:3303/api/users
*/
router.get("/", asyncHandler(userController.getAllUsers));


/**
 * @route   GET /api/users/:id
 * @desc    根据ID获取特定用户
 * @access  Public
 * 测试用例：
 * //用例1：获取存在的用户
 * curl -X GET http://localhost:3303/api/users/1
 * //用例2：获取不存在的用户
 * curl -X GET http://localhost:3303/api/users/9999
 */
router.get("/:id", asyncHandler(userController.getUserById));



/**
 * @route   POST /api/users
 * @desc    创建用户
 * @access  Public
 * 测试用例：
  //用例1：创建新用户 client URL
  curl -X POST http://localhost:3303/api/users -H "Content-Type: application/json" -d "{\"nickName\": \"测试用户\", \"avatarUrl\": \"http://example.com/avatar.png\", \"openid\": \"unique_openid_123\", \"active\": 1}"
  //用例2：创建用户，缺少必填字段 nickName
  curl -X POST http://localhost:3303/api/users -H "Content-Type: application/json" -d "{\"avatarUrl\": \"http://example.com/avatar.png\", \"openid\": \"unique_openid_123\", \"active\": 1}"
  //用户3：创建用户，其中的openid已存在
  curl -X POST http://localhost:3303/api/users -H "Content-Type: application/json" -d "{\"nickName\": \"测试用户2\", \"avatarUrl\": \"http://example.com/avatar2.png\", \"openid\": \"unique_openid_123\", \"active\": 1}"
  //重复执行，openid会重复，应报openid重复错误
  curl -X POST http://localhost:3303/api/users -H "Content-Type: application/json" -d "{\"nickName\": \"测试用户2\", \"avatarUrl\": \"http://example.com/avatar2.png\", \"openid\": \"unique_openid_123\", \"active\": 1}"
  
  */
router.post("/", asyncHandler(userController.createUser));


/**
 * @route   PATCH /api/users/:id 对照： GET /api/users/:id
 * @desc    更新用户信息
 * @access  Public
 * 测试用例：
  //用例1：更新存在的用户
  curl -X PATCH http://localhost:3303/api/users/1 -H "Content-Type: application/json" -d "{\"nickName\": \"更新后的昵称\", \"active\": 1}"
  //用例2：更新不存在的用户
  curl -X PATCH http://localhost:3303/api/users/9999 -H "Content-Type: application/json" -d "{\"nickName\": \"更新后的昵称\", \"active\": 1}"
  //用例3：更新用户，参数错误
  curl -X PATCH http://localhost:3303/api/users/1 -H "Content-Type: application/json" -d "{\"nickName\": \"\", \"active\": 1}"
  //用例4：更新用户，参数错误
  curl -X PATCH http://localhost:3303/api/users/1 -H "Content-Type: application/json" -d "{\"active\": 3}"
  //用例5：更新用户，更新openid
  //第一步：加载用户1的信息，查看openid
  curl -X GET http://localhost:3303/api/users/1
  //第二步：更新用户1的openid到用户2中，会报错。
  curl -X PATCH http://localhost:3303/api/users/2 -H "Content-Type: application/json" -d "{\"openid\": \"o1234\"}"
  //用例6：更新用户，更新openid为空值
  curl -X PATCH http://localhost:3303/api/users/2 -H "Content-Type: application/json" -d "{\"openid\": null}"
  //用户7：更新用户，更新openid为正常值
  curl -X PATCH http://localhost:3303/api/users/2 -H "Content-Type: application/json" -d "{\"openid\": \"new_unique_openid_456\"}"
  
  */
router.patch("/:id", asyncHandler(userController.updateUser))

/**
 * @route   DELETE /api/users/:id
 * @desc    删除用户
 * @access  Public
 * 测试用例：
  //用例1：删除存在的用户
  curl -X DELETE http://localhost:3303/api/users/1
  //用例2：删除不存在的用户
  curl -X DELETE http://localhost:3303/api/users/9999
 */
router.delete("/:id", asyncHandler(userController.deleteUser));

//导出路由对象，供app.js使用
module.exports = router;
